# 函数中的参数

# 1.必要传参，也叫位置参数
# 定义函数时，根据要求必须要传递的参数，而且，在调用函数时根据函数定义的参数位置顺序来传递参数
# 注：传递和定义的参数的顺序及个数必须一致！
def test1(x, y):
    '''
    计算两个数字之和
    :param x: 必须是数字
    :param y: 必须是数字
    :return: 返回两个参数之和
    '''
    return x + y


result = test1(10, 20)
print(result)

# 2.关键字传参
# 函数调用，通过“键=值”形式加以指定，可以让函数更加清晰、容易使用，同时也清楚了参数的顺序需求
# 注：函数调用时，如果有位置参数时，位置参数必须在关键字参数的前面，但关键字之间不存在先后顺序

print(test1(y=10, x=30))


# 3.默认传参
#  用于定义函数，为参数提供默认值，调用函数时可不传该默认参数的值
# 注：所有位置参数必须出现在默认参数前，包括函数定义和调用
def test2(x, y, init_sum=10):
    init_sum += x + y
    return init_sum


print(test2(10, 20, 100))


# 4.不定长传参
# 不定长参数也叫可变参数，用于不确定调用的时候会传递多少个参数（不传参也可以）的场景
# 此时，来进行参数传递，会显得非常方便
# (1)不定长普通参数
# (2)不定长关键参数
def test3(*args, init_sum=10):
    print(type(args))
    if args:
        # for i in args:
        #     init_sum += i
        # 简约写法
        return init_sum + sum(args)
    return init_sum


print(test3())
print(test3(1, 2))
print(test3(1, 2, init_sum=30))


def test4(init_sum=10,**kwargs):
    type(type(kwargs))
    for k,v in kwargs.items():
        print(f'参数的名字:{k},参数的值：{v}')
    return init_sum+sum(kwargs.values())


print(test4(x=10, y=20, z=30))   #必须要指定名字

# 参数顺序：
# 位置参数-->默认传参-->不定长普通参数-->不定长关键字参数
# def test5(a,b,c=100,*args,**kwargs):
